<?php

namespace App\Logics;


use App\Models\Goods;
use App\Models\GoodsCate;
use App\Models\GoodsDesc;
use App\Models\User;

class GoodsLogic extends Logic
{


    // 返回列表数据
    public function lists($options = [])
    {
        $opt     = $this->option();
        $page    = $opt->getData('page', 1, 'intval');
        $rows    = $opt->getData('rows', 100, 'intval');
        $keyword = $opt->getData('keyword', null, 'trim');
        $cate_id = $opt->getData('cate_id', null, 'intval');
        $uid     = $opt->getData('uid', null, 'intval');
        $isLine  = $opt->getData('is_online', 1, 'intval');
        $verify  = $opt->getData('verify', null, 'intval');


        // 参数
        $is_get_cate_top        = $options['is_get_cate_top'] ?? 0;
        $is_get_cate_curr       = $options['is_get_cate_curr'] ?? 0;
        $is_get_cate_all_parent = $options['is_get_cate_all_parent'] ?? 0;  // 获取所有的父级，用于构建面包屑
        $is_get_cate_curr_cates = $options['is_get_cate_curr_cates'] ?? 0; // 当前栏目的子栏目
        $is_get_cate_top_cates  = $options['is_get_cate_top_cates'] ?? 0;  // 顶部栏目的子栏目
        $is_get_list_cate       = $options['is_get_list_cate'] ?? 0;  // 获取商品列表中每个商品的栏目
        $is_get_propose         = $options['is_get_propose'] ?? 0;  // 是否获取推荐商品
        $is_get_number          = $options['is_get_number'] ?? 0;  // 获取商品的指定个数
        $is_get_no_cate         = $options['is_get_no_cate'] ?? 0;  // 获取商品的栏目id是否不要使用
        $where_is_short_sale    = $options['where_is_short_sale'] ?? 0;  // 获取商品的栏目id是否不要使用
        $where_is_start         = $options['where_is_start'] ?? 0;  // 获取商品的栏目id是否不要使用
        $where_id_out           = $options['where_id_out'] ?? [];  // 获取商品的栏目id是否不要使用


        $order = "id DESC";
        $cache = ['status' => 1];
        $where = [['status', '=', 1]];  //  ['is_online', '=', $isLine]
        if($uid){
            $cache['uid'] = $uid;
            // 条件
            $where[] = ['uid', '=', $uid];
        }
        if($cate_id && (empty($is_get_no_cate))){
            // 如果 where 含有 function 生成的缓存key，不会起作用，所以会导致重复的key，则缓存无效
            $cateDb = new GoodsCate();
            $childs = $cateDb->getChildIds($cate_id);
            if($childs){
                $cache['cate_id'] = $childs;
                // 条件
                $where[] = [
                    function($qq) use ($childs) {
                        $qq = $qq->whereIn('cate_id', $childs);
                    },
                ];
            } else{
                $cache['cate_id'] = $cate_id;
                // 条件
                $where[] = ['cate_id', '=', $cate_id];
            }
        }
        if($keyword){
            $cache   = false;
            $where[] = $opt->orWhere('name', 'like', $keyword);
        }
        if($where_is_short_sale){
            $cache['is_short_sale'] = 1;
            // 条件
            $where[] = ['is_short_sale', '=', 1];
        }
        if($where_is_start){
            $cache['is_start'] = 1;
            // 条件
            $where[] = ['is_start', '=', 1];
        }
        if($is_get_propose){
            //$cache['is_propose'] = 1;
            // 条件
            //$where[] = ['is_propose', '=', 1];
            // 没有推荐 按销量排序
            $order = "sale_no DESC";
            $cache = false;
        }
        // ->whereNotIn  ->whereIn 不要缓存
        if($where_id_out){
            $where[] = [function($query) use ($where_id_out) { $query = $query->whereNotIn('id', $where_id_out); }];
            $cache   = false;
        }

        // 模型 和 查询
        $cateDb = new GoodsCate();
        $model  = new Goods();

        // 如果 where 含有 function 生成的缓存key，不会起作用，所以会导致重复的key，则缓存无效

        // 数据整理
        if($is_get_number){
            $list = $model->getListCache($cache, $where, $is_get_number, $order);
            if($list === false){
                return $this->_returnFail($model->getError());
            }
            $result = ['list' => $list];
        } else{
            $result = $model->listPageCache($cache, $where, $page, $rows, $order);
            if($result === false){
                return $this->_returnFail($model->getError());
            }
        }


        // 栏目信息
        if($cate_id){
            // 父级
            if($is_get_cate_top || $is_get_cate_top_cates){
                $result['top'] = $cateDb->getTopParent($cate_id);
                // 顶级栏目的子栏目
                if($is_get_cate_top_cates){
                    if($result['top']){
                        $result['top_child'] = $cateDb->getChild($result['top']['id'], false);
                    } else{
                        $result['top_child'] = [];
                    }
                }
            }
            // 当前栏目信息
            if($is_get_cate_curr || $is_get_cate_curr_cates){
                $result['cate'] = $cateDb->oneFindCache(['id' => $cate_id], ['id' => $cate_id]);
                if($is_get_cate_curr_cates){
                    $result['cate_child'] = $cateDb->getChild($cate_id, false);
                }
            }
            // 获取所有的父级
            if($is_get_cate_all_parent){
                $result['cate_parent'] = $cateDb->getAllParent($cate_id);
            }
        } else{
            if($is_get_cate_top){
                $result['top'] = [];
            }
            if($is_get_cate_top_cates){
                $result['top_child'] = [];
            }
            if($is_get_cate_curr){
                $result['cate'] = [];
            }
            if($is_get_cate_all_parent){
                $result['cate_parent'] = [];
            }
        }


        if($result['list']){
            if($is_get_list_cate){
                $cids  = array_column($result['list'], 'cate_id');
                $cates = $cateDb->getListInIdsCache($cids);
            }
            foreach($result['list'] as $key => $item){
                //$result['list'][$key]['cover']     = $this->getFullUrl($item['cover']);
                //$result['list'][$key]['is_status'] = $is_status;
                if($is_get_list_cate){
                    $_cid  = $item['cate_id'];
                    $_cate = $cates[$_cid] ?? [];
                    // 整理
                    $result['list'][$key]['cate'] = $_cate;
                }
            }
        }

        return $result;
    }

    // 查找
    public function show($options = [])
    {
        $id = $this->id();
        if(empty($id)){
            //return $this->_returnFail('请指定查看记录！');
            return $this->_returnFail('select_operation_id');
        }


        $where = [['id', '=', $id],]; // ['verify', '=', 1]
        $model = new Goods();
        $info  = $model->oneFindCache(['id' => $id], $where);
        if($info === false){
            return $this->_returnFail($model->getError());
        }
        if(empty($info)){
            //return $this->_returnFail('你要查看的商品不存在！');
            return $this->_returnFail('data_has_not_exist');
        }
        // 附表
        $info = is_object($info) ? $info->toArray() : $info;
        $desc = (new GoodsDesc())->getOneByIdCache($info['id'], '*', 'goods_id');
        $info = array_merge($desc, $info);

        // 参数
        $is_get_cate_top        = $options['is_get_cate_top'] ?? 0;
        $is_get_cate_curr       = $options['is_get_cate_curr'] ?? 0;
        $is_get_cate_all_parent = $options['is_get_cate_all_parent'] ?? 0;  // 获取所有的父级，用于构建面包屑
        $is_get_cate_curr_cates = $options['is_get_cate_curr_cates'] ?? 0; // 当前栏目的子栏目
        $is_get_cate_top_cates  = $options['is_get_cate_top_cates'] ?? 0;  // 顶部栏目的子栏目
        $is_get_list_cate       = $options['is_get_list_cate'] ?? 0;  // 获取商品列表中每个商品的栏目


        // 数据整理
        //$info['cover']  = $this->getFullUrl($info['cover']);
        if(is_string($info['images'])){
            $info['images'] = $info['images'] ? json_decode($info['images'], true) : [];
        }
        // 查找用户信息
        if($info['cate_id']){
            $cid    = $info['cate_id'];
            $cateDb = new GoodsCate();
            if($is_get_cate_curr){
                $info['cate'] = $cateDb->getOneByIdCache($cid);
            }
            if($is_get_cate_top){
                $info['top'] = $cateDb->getTopParent($cid);
            }
            if($is_get_cate_all_parent){
                $info['cate_parent'] = $cateDb->getAllParent($cid);
            }
        }

        return $info;
    }


}

